package lang

import (
	"JVM/Jvmgo/GoToJVM/native"
	"JVM/Jvmgo/GoToJVM/runtimeData"
	"JVM/Jvmgo/GoToJVM/runtimeData/heap"
)

/*
方法描述符结构：

	方法: int[] g(String, int)
	描述符: (Ljava/lang/String;I)[I。
*/
func init() {
	native.Register("java/lang/Class", "getPrimitiveClass", "(Ljava/lang/String;)Ljava/lang/Class;", getPrimitiveClass)
	native.Register("java/lang/Class", "getName0", "()Ljava/lang/String;", getName0)
	native.Register("java/lang/Class", "desiredAssertionStatus0", "(Ljava/lang/Class;)Z", desiredAssertionStatus0)
}

// static native Class<?> getPrimitiveClass(String name)
// getPrimitiveClass 是一个通常在 JVM 实现或类库中见到的方法，用于获取原始类型（primitive type）的 Class 对象。
func getPrimitiveClass(frame *runtimeData.Frame) {
	nameObj := frame.LocalVars().GetRef(0)
	name := heap.GoString(nameObj)

	loader := frame.Method().Class().Loader()
	class := loader.LoadClass(name).JClass()

	frame.OperandStack().PushRef(class)
}

// private native String getName
func getName0(frame *runtimeData.Frame) {
	this := frame.LocalVars().GetThis()
	class := this.Extra().(*heap.Class)

	name := class.JavaName()
	nameObj := heap.JString(class.Loader(), name)

	frame.OperandStack().PushRef(nameObj)
}

// 由于getPrimitiveClass初始化会调用 desiredAssertionStatus0() 这里先不实现了 todo
func desiredAssertionStatus0(frame *runtimeData.Frame) {
	frame.OperandStack().PushBoolean(false)
}
